package com.candy.dao;

import java.sql.*;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;

/**
 * 因为资源不能够一直持有，需要进行关闭，但关闭后们不能继续从resultSet中进行数据获取
 * 所以需要解决以上问题，对数据进行转储
 * 常见的数据转储方式（1、list<map>   2、List<javabean>）
 */
public class DBHelper2 {
    public static void main(String[] args) {
        try {
//（0）下载jdbc驱动包；将驱动包导入项目。
// 注意：mysql8和mysql5的驱动包版本不通用。
//        本次项目使用maven进行构建，所有需要的jdbc依赖直接通过pom文件中指定依赖导入即可
// （1）注册或实例化jdbc的驱动类
//        使用反射的方式，指定驱动的全限定类的路径名字
            Class.forName("com.mysql.cj.jdbc.Driver");
// （2）获取数据库连接对象Connection
//            创建数据库连接对象需要准备三个参数
//            （a）数据库的连接串
//           jdbc:mysql使用jdbc链接mysql数据库
//            localhost表示要链接的数据库的ip
//            3306表示mysql的端口号
//            database_name要连接的数据库的名字
            String url="jdbc:mysql://localhost:3306/ld_mysql0317? characterEncoding=utf8 & useSSL=false & serverTimezone=UTC & rewriteBatchedStatements=true";
//          (b)数据库的用户名
            String username="root";
//            (c)数据库的密码
            String password="123456";
            Connection conn=DriverManager.getConnection(url,username,password);
// （3）获取数据库操作对象Statement（执行增删改查）
            Statement ment=conn.createStatement();
// （4）执行SQL语句，获取数据操作结果或者结果集对象ResultSet
            String sql="SELECT * FROM userinfo";
            ResultSet re=ment.executeQuery(sql);
// （5）解析结果集对象ResultSet，进行相关的业务处理；
//            创建一个容易，用来存储数据
            List<HashMap<String,Object>> datalist=new LinkedList<>();
//            获取元数据
            ResultSetMetaData rm=re.getMetaData();
//            获取数据表中一共有多少个列
            int count=rm.getColumnCount();
//            准备每一行数据存放的map
            HashMap eachRow=null;
//       next方法，读取resultSet的数据，若当前行有数据，则返回true，若当前行没有数据，则返回false
            while (re.next()){
//                每一行的数据存在在一个map中
                eachRow=new HashMap();
//                循环操作，将每一类的数据存放在map中
//                根据列的格式进行循环遍历
                for (int i = 1; i <=count ; i++) {
//                    将数据添加操map中
//                    rm.getColumnLabel(i)获取对应列的列名
//                    re.getObject(rm.getColumnLabel(i))通过列名获取对应列的值
                    eachRow.put(rm.getColumnLabel(i),re.getObject(rm.getColumnLabel(i)));
                }
//               将每一行的数据添加到list中
                datalist.add(eachRow);
            }
//           关闭连接
            re.close();
            ment.close();
            conn.close();
//            当连接关闭后，也能够直接获取list中的数据结果
//            对list进行遍历，list中的每个元素都是一个map
            for(HashMap<String,Object> hm:datalist){
//                对map进行曲所有的key值
                Set s=hm.keySet();
//                遍历所有key组成的set集合
                for (Object ob:s){
//                    打印key中，与通过key值取出的value（hm.get(ob)）
                    System.out.print("key:"+ob+";value:"+hm.get(ob)+"\t");
                }
                System.out.println();
            }
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }


    }
}
